#include <iostream>
#include <cstdlib>
#include "archivoTerminos.h"
#include "archivoTermDoc.h"
#include "archivoDocTerm.h"
#include "archivoNGramas.h"
#include "archivoIdTerminos.h" 
#include "archivoDocumentos.h"

using std::cout;
using std::endl;

void pruebaATerminos(){
	archivoTerminos archPalabras(std::string("archivoTerminos.dat"));
	
    //pequeño ejemplo de como usar el archivo de paralabras

    cout << "Agregamos palabras al archivo" << '\n';
    string cadena = "Pal1";
    archPalabras.agregarPalabra(cadena);
    cadena = "dos";
    archPalabras.agregarPalabra(cadena);
    cadena = "tres";
    archPalabras.agregarPalabra(cadena);
    cadena = "estetienemasdediez";
    archPalabras.agregarPalabra(cadena);
    cadena = "estetienemasdedieztambien";
    archPalabras.agregarPalabra(cadena);

    long int cant = archPalabras.obtenerCantidadPalabras();
    cout << "cantidad de palabras: " << cant << endl;

    cadena = "Pal1";
    cant = archPalabras.obtenerIdPalabra(cadena);
    cout << "Palabra: " << cadena << " tiene id. " << cant << endl;

    cadena = "estetienemasdediez";
    cant = archPalabras.obtenerIdPalabra(cadena);
    cout << "Palabra: " << cadena << " tiene id. " << cant << endl;

    cadena = "estetienemasdedieztambien";
    cant = archPalabras.obtenerIdPalabra(cadena);
    cout << "Palabra: " << cadena << " tiene id. " << cant << endl;

}

void pruebaATermDoc(){
	archivoTermDoc archTermDoc(string("archivoTermDoc.dat"));
	cout << "Agregamos varias relaciones" << endl;
	archTermDoc.agregarTermDoc(1,1);
	archTermDoc.agregarTermDoc(1,5);
	archTermDoc.agregarTermDoc(1,8);
	archTermDoc.agregarTermDoc(1,3);
	archTermDoc.agregarTermDoc(1,24);
	archTermDoc.agregarTermDoc(1,10);
	
	archTermDoc.agregarTermDoc(5,88);
	archTermDoc.agregarTermDoc(5,12);
	archTermDoc.agregarTermDoc(5,84);

	//obetenemos vector con todas los docs con idterm = 1
	cout << "docs con idterm = 1" << endl;
	vector<long> arreglo = archTermDoc.obtenerDocumentos(1);
	
	for (unsigned r=0; r < arreglo.size() ;r++) {
		cout << arreglo[r] << endl;
	}
	
	//obetenemos vector con todas los docs con idterm = 5
	cout << "docs con idterm = 5" << endl;
	arreglo = archTermDoc.obtenerDocumentos(5);
	for (unsigned r=0; r < arreglo.size() ;r++) {
		cout << arreglo[r] << endl;
	}
	
	//eliminamos algunas relaciones de idterm = 1
	archTermDoc.eliminarTermDoc(1,5);
	archTermDoc.eliminarTermDoc(1,8);
	//obtenemos nuevamente el vector
	cout << "docs con idterm = 1 (con eliminados)" << endl;
	arreglo = archTermDoc.obtenerDocumentos(1);
	for (unsigned r=0; r < arreglo.size() ;r++) {
		cout << arreglo[r] << endl;
	}

}

void pruebaADocTerm() {
	archivoDocTerm archDocTerm(string("archivoDocTerm.dat"));
	cout << "Agregamos varias relaciones en archivoDocTerm" << endl;
	archDocTerm.agregarRelacion(5, 1, 8);
	archDocTerm.agregarRelacion(5, 3, 2);
	archDocTerm.agregarRelacion(5, 1);
	archDocTerm.agregarRelacion(5, 5, 5);
	cout << "Tabla de frecuencia para idDoc = 5" << endl;
	vector<IdTerm_Frec> tablafrec = archDocTerm.obtenerIdTermFrec(5);
	for (unsigned r=0; r < tablafrec.size() ;r++) {
		cout << "id_term: " << tablafrec[r].IdTermino;
		cout << " frec: " << tablafrec[r].Frecuencia << endl;
	}
	cout << "Frecuencia de term 5 en doc 5: " << archDocTerm.obtenerFrecuencia(5, 5) << endl;
	archDocTerm.eliminarRelacion(5,5);
	cout << "Tabla de frecuencia para idDoc = 5" << endl;
	tablafrec = archDocTerm.obtenerIdTermFrec(5);
	for (unsigned r=0; r < tablafrec.size() ;r++) {
		cout << "id_term: " << tablafrec[r].IdTermino;
		cout << " frec: " << tablafrec[r].Frecuencia << endl;
	}
	cout << "Frecuencia de term 5 en doc 5: " << archDocTerm.obtenerFrecuencia(5, 5) << endl;
}

void pruebaANGramas() {
	archivoNGramas archNGramas(string("archivoNGramas.dat"));
	cout << "Agregamos bigramas con sus relaciones idterm" << endl;
	archNGramas.agregarNGrama("$a",1);
	archNGramas.agregarNGrama("$a",4);
	archNGramas.agregarNGrama("$a",2);
	archNGramas.agregarNGrama("$a",18);
	archNGramas.agregarNGrama("$a",1); //repetimos...
	archNGramas.agregarNGrama("ac",18);
	archNGramas.agregarNGrama("ac",1);
	archNGramas.agregarNGrama("ca",18);
	cout << "Listamos todos los idterminos de $a: " << endl;
	vector<long> listaterminos = archNGramas.obtenerTerminos("$a");
	for (unsigned r=0; r < listaterminos.size() ;r++) {
		cout << listaterminos[r] << endl;
	}
	
}

void pruebaAIdTerminos() {
	archivoIdTerminos archIdTerminos(string("archivoIdTerminos.dat"));
	cout << "Agregamos algunos terminos y su id" << endl;
	string palabra = "primerapalabra";
	archIdTerminos.agregarTermino(1,palabra);
	palabra = "palabraid401";
	archIdTerminos.agregarTermino(401,palabra);
    palabra = "otrapalabra";
	archIdTerminos.agregarTermino(401,palabra); //intento poner en el mismo id
	palabra = "finalmente";
	archIdTerminos.agregarTermino(2,palabra);
	
	palabra = archIdTerminos.obtenerTermino(1);
	cout << "id   1: " << palabra << endl;
	palabra = archIdTerminos.obtenerTermino(2);
	cout << "id   2: " << palabra << endl;
	palabra = archIdTerminos.obtenerTermino(401);
	cout << "id 401: " << palabra << endl;
	palabra = archIdTerminos.obtenerTermino(5000); //busco una que no agregue
	cout << "id 5000: " << palabra << endl;   //debe dar vacio!
}

void pruebaADocumentos() {
	archivoDocumentos archDocumentos(string("archivoDocumentos.dat"),string("archivoDocumentosSec.dat"));
	string ruta;
	
	cout << "Agregamos la ruta de archivo y obetenmos su id" << endl;
	ruta = "/usr/datos/datos1.txt";
	long idDoc = archDocumentos.agregarDocumento(ruta);
	cout << "**** agregada, id de la ruta=" << ruta <<  ": (" << idDoc << ")" << endl;
	ruta = "/usr/datos/datos2.txt";
	idDoc = archDocumentos.agregarDocumento(ruta);
	cout << "**** agregada, id de la ruta=" << ruta <<  ": (" << idDoc << ")" << endl;
	ruta = "/usr/zarazaaaaa";
	idDoc = archDocumentos.agregarDocumento(ruta);
	cout << "**** agregada, id de la ruta=" << ruta <<  ": (" << idDoc << ")" << endl;
	cout << endl;	
	
	cout << "Buscamos por ruta el id:" << endl;
	cout << "id de la ruta=" << ruta <<  ": ("  << archDocumentos.obtenerIdDocumento(ruta) << ")" << endl;
	ruta = "/usr/datos/datos2.txt";
	cout << "id de la ruta=" << ruta <<  ": ("  << archDocumentos.obtenerIdDocumento(ruta) << ")" << endl;
	ruta = "/usr/datos/noloagregue.txt";
	cout << "id de la ruta=" << ruta <<  ": ("  << archDocumentos.obtenerIdDocumento(ruta) << ")" << endl;
	cout << endl;
	
	cout << "Buscamos ruta  por id:" << endl;
	cout << "ruta doc Id=2: (" << archDocumentos.obtenerRutaDocumento(2) << ")" << endl;
	cout << "ruta doc Id=3: (" << archDocumentos.obtenerRutaDocumento(3) << ")" << endl;
	cout << "ruta doc Id=103: (" << archDocumentos.obtenerRutaDocumento(103) << ") Deberia ser vacio" << endl;

}

int ejemplouso (int argc, char* argv[]){
	
	cout << "Ejemplo de uso de los archivos" << endl;	
	//pruebaATerminos(); //archivoTerminos	
	//pruebaATermDoc();  //archivoTermDoc
	//pruebaADocTerm();  //archivoDocTerm
	//pruebaANGramas();  //archivoNGramas
	//pruebaAIdTerminos(); //archivoIdTerminos
	pruebaADocumentos();   //archivoDocumentos
	cout << "FIN." << endl;
	
	return 0;
}
